#include "mygraphicline.h"

#include <QDebug>

MyGraphicLine::MyGraphicLine(QWidget *parent) : QWidget(parent)
{
//    QPalette p = this->palette();
//    p.setColor(QPalette::Background, Qt::red);
//    this->setAutoFillBackground(true);
//    this->setPalette(p);

    this->setAttribute(Qt::WA_TransparentForMouseEvents, true);
}

void MyGraphicLine::resizeMyWidget()
{
    QPointF start;
    QPointF end;
    int margin = 10; // 当 p1 p2 在同一个平面上时，扩大区域的大小

    // 获得圆心
    QPointF p1 = ellipse1->pos();
    QPointF p2 = ellipse2->pos();

    p1.setX(p1.x() + ellipse1->getRadius());
    p1.setY(p1.y() + ellipse1->getRadius());

    p2.setX(p2.x() + ellipse2->getRadius());
    p2.setY(p2.y() + ellipse2->getRadius());

    // 根据两个圆心的位置，计算出直线的起点和终点
    if (p1.x() < p2.x() && p1.y() < p2.y()) { // p1 在 p2 左上方
        qreal arc = atan((p2.y() - p1.y()) / (p2.x() - p1.x())); // 所求角的角度：正切值(tan)的反正切(arctan)
        qreal a = sin(arc) * ellipse1->getRadius();
        qreal b = cos(arc) * ellipse1->getRadius();

        start.setX(p1.x() + b);
        start.setY(p1.y() + a);

        end.setX(p2.x() - b);
        end.setY(p2.y() - a);

        // 更新线坐标
        this->move(static_cast<int>(start.x()), static_cast<int>(start.y()));
        this->resize(static_cast<int>(end.x() - start.x()), static_cast<int>(end.y() - start.y()));

        // 设置直线方向
        lineDirect = LEFT_UP_RIGHT_DOWN;

    } else if (p1.x() > p2.x() && p1.y() < p2.y()) { // p1 在 p2 右上方
        qreal arc = atan((p2.y() - p1.y()) / (p1.x() - p2.x())); // 所求角的角度：正切值(tan)的反正切(arctan)
        qreal a = sin(arc) * ellipse1->getRadius();
        qreal b = cos(arc) * ellipse1->getRadius();

        start.setX(p1.x() - b);
        start.setY(p1.y() + a);

        end.setX(p2.x() + b);
        end.setY(p2.y() - a);

        // 更新线坐标
        this->move(static_cast<int>(end.x()), static_cast<int>(start.y()));
        this->resize(static_cast<int>(start.x() - end.x()), static_cast<int>(end.y() - start.y()));

        // 设置直线方向
        lineDirect = RIGHT_UP_LEFT_DOWN;

    } else if (p1.x() < p2.x() && p1.y() > p2.y()) { // p1 在 p2 的左下方
        qreal arc = atan((p1.y() - p2.y()) / (p2.x() - p1.x())); // 所求角的角度：正切值(tan)的反正切(arctan)
        qreal a = sin(arc) * ellipse1->getRadius();
        qreal b = cos(arc) * ellipse1->getRadius();

        start.setX(p1.x() + b);
        start.setY(p1.y() - a);

        end.setX(p2.x() - b);
        end.setY(p2.y() + a);

        // 更新线坐标
        this->move(static_cast<int>(start.x()), static_cast<int>(end.y()));
        this->resize(static_cast<int>(end.x() - start.x()), static_cast<int>(start.y() - end.y()));

        // 设置直线方向
        lineDirect = RIGHT_UP_LEFT_DOWN;

    } else if (p1.x() > p2.x() && p1.y() > p2.y()) { // p1 在 p2 右下方
        qreal arc = atan((p1.y() - p2.y()) / (p1.x() - p2.x())); // 所求角的角度：正切值(tan)的反正切(arctan)
        qreal a = sin(arc) * ellipse1->getRadius();
        qreal b = cos(arc) * ellipse1->getRadius();

        start.setX(p1.x() - b);
        start.setY(p1.y() - a);

        end.setX(p2.x() + b);
        end.setY(p2.y() + a);

        // 更新线坐标
        this->move(static_cast<int>(end.x()), static_cast<int>(end.y()));
        this->resize(static_cast<int>(start.x() - end.x()), static_cast<int>(start.y() - end.y()));

        // 设置直线方向
        lineDirect = LEFT_UP_RIGHT_DOWN;

    } else if (fabs(p1.x() - p2.x()) < 0.001) { // 当 p1 p2 在垂直线上
        if (p1.y() < p2.y()) {
            this->move(static_cast<int>(p1.x() - margin / 2.0), static_cast<int>(p1.y() + ellipse1->getRadius()));
            this->resize(static_cast<int>(margin), static_cast<int>(p2.y() - p1.y() - 2 * ellipse1->getRadius()));
        } else {
            this->move(static_cast<int>(p2.x() - margin / 2.0), static_cast<int>(p2.y() + ellipse1->getRadius()));
            this->resize(static_cast<int>(margin), static_cast<int>(p1.y() - p2.y() - 2 * ellipse1->getRadius()));
        }

        // 设置直线方向
        lineDirect = UP_MIDDLE_DOWN_MIDDLE;

    } else if (fabs(p1.y() - p2.y()) < 0.001) { // 当 p1 p2 在水平线上

        if (p1.x() < p2.x()) {
            this->move(static_cast<int>(p1.x() + ellipse1->getRadius()), static_cast<int>(p1.y() - margin / 2.0));
            this->resize(static_cast<int>(p2.x() - p1.x() - 2 * ellipse1->getRadius()), static_cast<int>(margin));
        } else {
            this->move(static_cast<int>(p2.x() + ellipse1->getRadius()), static_cast<int>(p2.y() - margin / 2.0));
            this->resize(static_cast<int>(p1.x() - p2.x() - 2 * ellipse1->getRadius()), static_cast<int>(margin));
        }

        // 设置直线方向
        lineDirect = LEFT_MIDDLE_RIGHT_MIDDLE;
    }

    this->resize(this->size().width() + 1, this->size().height() + 1);
    this->repaint();
}

void MyGraphicLine::removeEllipseLineIndex(int index)
{
    this->ellipse1->removeLineIndex(index);
    this->ellipse2->removeLineIndex(index);
}

void MyGraphicLine::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)

    QPainter p(this);

    switch (lineDirect) {
    case LEFT_UP_RIGHT_DOWN:
        p.drawLine(0, 0, this->width(), this->height());
        break;

    case UP_MIDDLE_DOWN_MIDDLE:
        p.drawLine(this->width() / 2, 0, this->width() / 2, this->height());
        break;

    case RIGHT_UP_LEFT_DOWN:
        p.drawLine(this->width(), 0, 0, this->height());
        break;

    case LEFT_MIDDLE_RIGHT_MIDDLE:
        p.drawLine(0, this->height() / 2, this->width(), this->height() / 2);
        break;
    }

}

void MyGraphicLine::setEllipse1(MyGraphicEllipse *ellipse)
{
    this->ellipse1 = ellipse;
}

void MyGraphicLine::setEllipse2(MyGraphicEllipse *ellipse)
{
    this->ellipse2 = ellipse;
}

